﻿using DG.Tweening; // 使用 DOTween 动画库
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Splines; // 使用 Unity Splines 系统

/// <summary>
/// 手牌视图控制器，管理手牌在 Spline 路径上的布局和动画
/// </summary>
public class HandView : MonoBehaviour
{
    [SerializeField] private SplineContainer splineContainer; // 手牌布局的 Spline 路径容器
    private readonly List<CardView> cards = new List<CardView>(); // 当前持有的手牌列表

    /// <summary>
    /// 添加卡牌到手牌区并更新布局（协程）
    /// </summary>
    /// <param name="cardView">要添加的卡牌视图</param>
    /// <returns>协程迭代器</returns>
    public IEnumerator AddCard(CardView cardView)
    {
        cards.Add(cardView);
        yield return UpdateCardPositions(0.15f); // 添加后自动重新布局，动画时长0.15秒
    }

    /// <summary>
    /// 更新所有卡牌在 Spline 上的位置和旋转（协程）
    /// </summary>
    /// <param name="duration">动画持续时间（秒）</param>
    /// <returns>协程迭代器</returns>
    public IEnumerator UpdateCardPositions(float duration)
    {
        if (cards.Count == 0) yield break; // 没有卡牌时直接退出

        // 计算卡牌间距和起始位置（基于卡牌数量均匀分布）
        float cardSpacing = 1f/10f; // 每张卡牌在Spline上的间隔比例
        float firstCardPosition = 0.5f - (cards.Count - 1) * cardSpacing / 2f; // 居中计算起始位置

        Spline spline = splineContainer.Spline; // 获取Spline引用

        // 遍历所有卡牌计算新位置
        for (int i = 0; i < cards.Count; i++)
        {
            float t = firstCardPosition + i * cardSpacing; // 当前卡牌在Spline上的参数位置

            // 计算Spline上的位置和方向
            Vector3 splinePosition = spline.EvaluatePosition(t);
            Vector3 forward = spline.EvaluateTangent(t);
            Vector3 up = spline.EvaluateUpVector(t);

            // 计算卡牌旋转（使卡牌始终面向玩家）
            Quaternion rotation = Quaternion.LookRotation(-up, Vector3.Cross(-up, forward).normalized);

            // 使用DOTween动画移动和旋转卡牌
            cards[i].transform.DOMove(splinePosition + transform.position + 0.01f*i*Vector3.up, duration);
            cards[i].transform.DORotate(rotation.eulerAngles, duration);

            cards[i].GetComponent<SortingGroup>().sortingOrder = i; // 设置排序顺序以避免遮挡
        }

        yield return new WaitForSeconds(duration); // 等待动画完成
    }

    /// <summary>
    /// 从手牌区移除指定卡牌
    /// </summary>
    /// <param name="card">要移除的卡牌数据</param>
    /// <returns>被移除的卡牌视图（如未找到返回null）</returns>
    public CardView RemoveCard(Card card)
    {
        CardView cardView = GetCardView(card);
        if (cardView == null) return null;

        cards.Remove(cardView);

        StartCoroutine(UpdateCardPositions(0.15f)); // 异步更新布局

        return cardView;
    }

    /// <summary>
    /// 根据卡牌数据查找对应的卡牌视图
    /// </summary>
    /// <param name="card">要查找的卡牌数据</param>
    /// <returns>找到的卡牌视图（如未找到返回null）</returns>

    public CardView GetCardView(Card card)
    {
        if (card == null)
        {
            Debug.LogWarning("尝试查找null卡牌的视图");
            return null;
        }

        // 反向遍历，优先匹配最后添加的卡牌
        for (int i = cards.Count - 1; i >= 0; i--)
        {
            if (cards[i] != null &&
                cards[i].Card != null &&
                cards[i].Card.ID == card.ID)
            {
                return cards[i];
            }
        }

        Debug.LogWarning($"未找到卡牌 ID:{card.ID} 的视图");
        return null;
    }
}